import axios from "axios";
import {RedirectToLogin} from "../router";//引入路由文件的函数
import {Loading, MessageBox} from 'element-ui';//结构这个组件
const http = {};
let ContentTypes = {//辅助变量用来控制类型
    get:"application/x-www-form-urlencoded",
    post:"application/json",
    upload:"multipart/form-data"
};
let loadingInstance = null;//默认转圈圈为空
let alwaysPendingPromise = new Promise(() => {});//一个永远是挂起状态的promise
//在axios请求发出前触发(请求)
axios.interceptors.request.use(
    (config) => {  //如果可以发出
        loadingInstance = Loading.service({//转圈圈
            lock: true,
            text: ""//转圈圈的文本
        });
        return config //放行
    },
    (error) => {  //不能成功发出
        loadingInstance.close();//关闭转圈圈
        return Promise.reject(error);
    }
);
//在axios请求回来前触发(响应)
axios.interceptors.response.use(
    response => {  //能成功发出
        loadingInstance.close();//结束转圈
        return response.data || JSON.parse(response.request.responseText);/*去壳，并且兼容ie版本*/
    },
    error => {
        loadingInstance.close();//结束转圈
        return Promise.reject(error)
    }
);
/*封装弹出框*/
let MyMessageBox = (message, type) => {
    // MessageBox.alert(message,{//配置提示框
    //     title: "提示",
    //     type,
    //     showClose: false
    // });
};
/*------------------------------封装http-------------------------------------------*/
//upload也是特殊的post
["post", "get","upload"].forEach(item => { //在http对象里创建三个函数
    http[item] = (url, params) => {//params提交的数据
        params = item === "get" ? {params:params}:{data:params};//兼容post和get两种提交方式
        return axios({
            withCredentials:true,//让axios发送ajax默认携带cookie
            timeout:5000,//ajax提交最长等待时间
            method:item === "get"? item:"post",//配置提交的方式不是get就是post
            url,//第一个参数就是url跳转路径
            ...params, ///展开运算符，把params对象去掉{}，把里面的内容取出来
            headers:{//内容类型
                "Content-Type":ContentTypes[item]
            }
        })
            .then(({status, message, data}) => {//status标识符表示是否成功，返回message用户的信息，data返回的数据
                if(message){//如果message有要返回给用户的内容
                    MyMessageBox(message, status === 200 ? "success":"warning");//内容，类型
                }
                switch(status){
                    case 200:
                        return data;
                        break;
                    case 999:
                        RedirectToLogin();//调用函数改变路由，跳转到login
                    default:
                        return alwaysPendingPromise//返回永远挂起的promise对象
                }
            })
            .catch(errors => {
                MyMessageBox("错误", errors.error);
                return alwaysPendingPromise//返回永远挂起的promise对象
            })
    }
});
export default http;//把http导出